layui.use(['tree','element','layer'], function() {
    let tree = layui.tree;
    var layer = layui.layer;
    let $ = layui.$;

    /**
     * 通过递归过滤隐藏的菜单，以便绑定树控件
     * @param data
     * @param arr
     * @returns {*}
     */
    function filterTreeMenus(data, arr) {
        for(let item of data) {
            if(!item.hidden) {
                // 如果满足条件时，用新node代替，然后把chilren清空
                let node = {...item, children: []}
                arr.push(node)
                if(item.children && item.children.length > 0) {
                    filterTreeMenus(item.children, node.children)
                }
            }
        }
        return arr;
    }

    // 加载菜单树
    $.ajax({
        type: 'post',
        url: Api.uaa.menu.user,
        data: JSON.stringify({roleNames: getTokenInfo().roleNames,
            platformId: getTokenInfo().platformId}),
        dataType: 'json',
        contentType  : 'application/json',
        success: function(result) {
            let arr = filterTreeMenus(result.data, []);
            //渲染
            var inst1 = tree.render({
                elem: '#test1'  //绑定元素
                ,data:  arr
                ,edit: ['add', 'update', 'del'] //操作节点的图标
                ,click: function(obj){
                    if(obj.data.children.length == 0) {
                        window.frames['mainFrame'].location.href = 'views/' +  obj.data.component + '.html'
                    }
                    //layer.msg(JSON.stringify(obj.data));
                }
            });
        },
        error: function(xhr) {
            console.log(xhr);
            layer.alert('加载菜单错误!<br>' + xhr.responseJSON.msg)
        }
    });

    $(".logout").click(function () {
        layer.confirm('确定注销？', {
            btn: ['确定', '取消'] //可以无限个按钮
        }, function(index, layero){
            //按钮【按钮一】的回调
            sessionStorage.clear();
            location.reload();
        }, function(index){
            //按钮【按钮二】的回调
        });
    })
    /*
    * token自动续期
    * 当token有效期低于50%时，自动调用refreshToken给token续期
    * 如果refreshToken到期，不管token有效期是否有效，统一注销前端用户
    */
    let halfLimit = ((getTokenInfo().tokenExpireTime - getTokenInfo().tokenCreateTime) / 1000) / 2
    setInterval(function () {
        let tokenCountdown = Math.floor((getTokenInfo().tokenExpireTime - Date.now()) / 1000)
        let refreshTokenCountdown = Math.floor((getTokenInfo().refreshTokenExpireTime - Date.now()) / 1000)
        // 续期后有效期可能超过refreshToken的有效期，所以加入refreshTokenCountdown <=0条件判断
        if(tokenCountdown <=0 || refreshTokenCountdown <=0 ) {
            alert('会话已经过期，请重新登录')
            sessionStorage.clear()
            window.top.location.href = '/login.html'
            return;
        }
        $("#tokenCountdown").html('剩余时间：' + getCountdown(tokenCountdown))
        $("#refreshTokenCountdown").html('总时间：' + getCountdown(refreshTokenCountdown))
        // refreshToken的有效期大于token有效期的一半才续期
        // 最后一次续期后token的有效期可能超过refreshToken的有效期，在前面代码进行了判断
        if(refreshTokenCountdown > halfLimit) {
            // token的有效时间小于一半，自动续期
            if(tokenCountdown < halfLimit) {
                layer.msg('刷新token')
                refreshToken()
            }
        }
    }, 1000)

    function refreshToken() {
        let tokenInfo = getTokenInfo();
        // request.js在index.html中加载一次后不会刷新，导致总是传递最初登录的token
        // 手动传递最新的token，自动续期，直至refreshToken也过期
        ajaxSetup($)
        $.post(Api.uaa.token.refresh, {"refreshToken": tokenInfo.refreshToken}, function (res) {
            tokenInfo.token = res.data.token;
            tokenInfo.tokenExpireTime = res.data.tokenExpireTime;
            sessionStorage.setItem(Global.TOKEN_INFO, JSON.stringify(tokenInfo));
        })
    }


})
